# Subsequence Mask 只有 Decoder的self-attention会用到,
# 主要作用是屏蔽未来时刻单词的信息。
def get_attn_subsequence_mask(seq):
    '''
    seq: [batch_size, tgt_len]
    '''
    attn_shape = [seq.size(0), seq.size(1), seq.size(1)]
    # [batch_size, tgt_len, tgt_len] 
    subsequence_mask = np.triu(np.ones(attn_shape), k=1)    
    # 首先通过np.ones() 生成一个全 1 的方阵,
    # 然后通过 np.triu() 生成一个上三角矩阵（对角线元素及其左下方全为0）
    subsequence_mask = torch.from_numpy(subsequence_mask).byte()
    # 转化成byte类型的tensor 
    return subsequence_mask  # [batch_size, tgt_len, tgt_len]
# 前瞻掩码
dec_self_attn_subsequence_mask=get_attn_subsequence_mask(dec_inputs)
# [batch_size, tgt_len, tgt_len] 
print(dec_self_attn_subsequence_mask)
